home *** CD-ROM | disk | FTP | other *** search
-
-
- > Does anyone have a program (not necessarily source) that will
- > take a full
- > screen GIF or PCX or whatever graphic format and convert it into
- > something I can load in Pascal? Or even a graphic editor that
-
- You can load a .PCX in pascal! No conversion needed. Here is some source.
-
- { MCGA PCX decode by Bas van Gaalen, Holland, PD }
- { Modified to use virtual screen/pointers by Ricky Booth, USA, PD }
-
-
- {$M 65520, 4096, 655360}
- {$I-}
-
- program pcx_view;
-
- uses
- crt;
-
- type
- pcxheader = record
- manufacturer,version,encoding,bits_per_pixel : byte;
- xmin,ymin,xmax,ymax,hres,vres : word;
- palette : array[0..47] of byte;
- reserved : byte;
- color_planes : byte;
- bytes_per_line : word;
- palette_type : word;
- filler : array[0..57] of byte;
- end;
-
- var
- pcxfile : file;
- header : pcxheader;
-
- {----------------------------------------------------------------------------}
-
- procedure error(errstr : string);
- begin
- writeln(errstr);
- halt;
- end;
-
- {----------------------------------------------------------------------------}
-
- function validpcx : boolean;
- begin
- seek(pcxfile,0);
- blockread(pcxfile,header,sizeof(header));
- with header do validpcx := (manufacturer = 10) and (version = 5) and
- (bits_per_pixel = 8) and (color_planes = 1);
- end;
-
- {----------------------------------------------------------------------------}
-
- function validpal : boolean;
- var v : byte;
- begin
- seek(pcxfile,filesize(pcxfile)-769);
- blockread(pcxfile,v,1);
- validpal := v = $0c;
- end;
-
- {----------------------------------------------------------------------------}
-
- procedure setvideo(md : word); assembler;
- asm
- mov ax,md
- int 10h
- end;
-
- {----------------------------------------------------------------------------}
-
- CONST VGA = $a000; (* This sets the constant VGA to the segment of the
- VGA screen. *)
-
- Type Virtual = Array [1..64000] of byte; { The size of our Virtual Screen }
- VirtPtr = ^Virtual; { Pointer to the virtual screen }
-
- VAR Virscr : VirtPtr; { Our first Virtual screen }
- Vaddr : word; { The segment of our virtual screen}
-
- procedure setpal;
- var pal : array[0..767] of byte;
- begin
- seek(pcxfile,filesize(pcxfile)-768);
- blockread(pcxfile,pal,768);
- asm
- cld
- xor di,di
- xor bx,bx
- @L1:
- mov dx,03c8h
- mov ax,bx
- out dx,al
- inc dx
- mov cx,3
- @L2:
- mov al,byte ptr pal[di]
- shr al,1
- shr al,1
- out dx,al
- inc di
- loop @L2
- inc bx
- cmp bx,256
- jne @L1
- end;
- end;
-
- {----------------------------------------------------------------------------}
-
- Procedure SetUpVirtual;
- BEGIN
- GetMem (VirScr,64000);
- vaddr := seg (virscr^);
- END;
-
- procedure unpack;
- var gofs,j : word; i,k,v,loop : byte;
- begin
- seek(pcxfile,128);
- gofs := 0;
- for i := 0 to header.ymax-header.ymin+1 do begin
- j := 0;
- while j < header.bytes_per_line do begin
- blockread(pcxfile,v,1);
- if (v and 192) = 192 then begin
- loop := v and 63;
- inc(j,loop);
- blockread(pcxfile,v,1);
- for k := 1 to loop do begin
- Mem[Vaddr:gofs] := v;
- inc(gofs);
- end;
- end
- else begin
- Mem[Vaddr:gofs] := v;
- inc(gofs);
- inc(j);
- end;
- end;
- end;
- end;
-
- Procedure WaitRetrace; assembler;
- label
- l1, l2;
- asm
- mov dx,3DAh
- l1:
- in al,dx
- and al,08h
- jnz l1
- l2:
- in al,dx
- and al,08h
- jz l2
- end;
-
- {----------------------------------------------------------------------------}
-
- begin
- SetUpVirtual; (*initilizes the pointers*)
- if paramstr(1) = '' then error('Enter filename on commandline.');
- assign(pcxfile,paramstr(1));
- reset(pcxfile,1);
- if ioresult <> 0 then error(paramstr(1)+' not found.');
- if not validpcx then error('Not a 256 color PCX file.');
- if not validpal then error('Palette corrupt.');
- Writeln('Decoding Image...');
- Unpack;
- Setvideo($13);
- Setpal;
- Move(Virscr^,MEM[VGA:0],64000); (*Stick the virtual page to the vga mem*)
- repeat until keypressed;
- While keypressed do readln;
- setvideo(3);
- close(pcxfile);
- FreeMem (VirScr,64000); (*Free up virtual memory*)
- end.